三维场景展示

最后更新时间:2020年12月18日

三维数据加载方法

功能描述

MapGIS Mobile for Android支持多种三维数据的展示,包括离线的三维矢量、地形、引用二维地图,以及在线的IGServer二维地图服务、三维服务、OGC服务、第三方通用地图服务等。接下来讲解各种数据的具体加载方法。

实现方法

三维场景显示方法.png

(1)实例化三维图层对象,即各类数据图层:三维矢量图层(VectorLayer3D)、地形图层(TerrainLayer3D)、模型图层(ModelCacheLayer3D)、服务图层(ServerLayer3D)、二维引用地图(MapRefLayer)等,然后设置必要的信息:数据驱动类型、URL、图层参考系;

(2)通过场景Scene对象的addLayer()、insertLayer()接口加载各类图层对象;

(3)通过场景视图SceneView对象调用setSceneAsync()接口设置加载场景数据。

离线矢量数据 Sample详情

支持移动端加载shp格式的离线矢量数据,在准备好数据之后,需拷贝到移动设备的存储目录中。接下来重点讲解离线矢量数据的加载方法,其他数据加载方法类似。

1

实例化场景视图

在xml布局文件中添加SceneView视图控件之后,在java程序代码中实例化其对象。

SceneView sceneView = findViewById(R.id.sceneView);

2

创建矢量图层对象

加载离线矢量数据,构造VectorLayer3D图层对象,根据数据具体情况设置驱动类型、URL、图层参考系信息。

//创建矢量图层对象
VectorLayer3D mVectorLayer3D=new VectorLayer3D();
//1-设置数据驱动类型
mVectorLayer3D.setDriverType(DriverType.Driver_Type_OGR);         //用于离线矢量数据的读取
//2-设置图层URL
String dataPath= android.os.Environment.getExternalStorageDirectory().getPath()+"/MapGISSample/Scene/haiyang/haiyang.shp";                                //获取数据路径
mVectorLayer3D.setURL(dataPath);                                  //设置URL
//3-设置图层参考系
mVectorLayer3D.setSRSByString(SRSType.SRS_Type_Global_MERCATOR);  //WGS84,WEB墨卡托

重要说明:不同的三维数据需创建不同的图层对象,但都需要设置以下三部分信息。

(1)设置数据驱动类型-setDriverType():根据数据类型设置不同的驱动类型,作用是便于数据的读取、处理。各种驱动类型的字段由DriverType类提供。

(2)设置图层URL-setURL():设置数据URL,在线数据的URL、离线数据的本地文件路径。

(3)设置图层参考系-setSRSByString():根据数据的真实空间参考系设置对应的参数。

下方表格展示了MapGIS Mobile支持的各种三维场景数据类型,以及采用的图层对象、对应的数据驱动类型。

数据类型 图层对象类型 数据驱动类型
离线 矢量 VectorLayer3D DriverType.Driver_Type_OGR
用于离线矢量数据的读取
地形 TerrainLayer3D DriverType.Driver_Type_GDAL
用于离线栅格数据的读取
影像 ServerLayer3D DriverType.Driver_Type_GDAL
用于离线栅格数据的读取
模型 ModelCacheLayer3D DriverType.Driver_Type_Model_MapGIS_OP
MapGIS倾斜摄影数据驱动;
DriverType.Driver_Type_Model_MapGIS_M3D
MapGIS M3D缓存数据驱动
在线 MapGIS - 二维矢量、瓦片地图服务 ServerLayer3D DriverType.Driver_Type_MapGIS_Map
MapGIS地图服务驱动
MapGIS - 三维场景服务 DriverType.Driver_Type_MapGIS_3D
MapGIS三维服务驱动
OGC - WMS DriverType.Driver_Type_WMS
OGC WMS服务驱动
OGC - WFS DriverType.Driver_Type_WFS
OGC WFS服务驱动
TMS DriverType.Driver_Type_TMS
TMS服务驱动
第三方 - 天地图、Google地图服务等 DriverType.Driver_Type_XYZ
标准Web墨卡托地图服务驱动.如Google、百度等

空间参考系由SRSType类提供,目前只支持以下两种。

字段 说明
SRSType.SRS_Type_Global 全球,WGS84,经纬度
SRSType.SRS_Type_Global_MERCATOR 全球,WGS84,WEB墨卡托

3

构造三维场景对象

三维场景图层构造完成后,即可构造三维场景对象,然后为其添加图层。

//创建三维场景Scene(全局变量)
Scene mScene = new Scene();	
//为Scene添加图层
mScene.addLayer(mVectorLayer3D);

4

场景加载

调用SceneView的setSceneAsync接口异步加载场景,并且提供回调函数,可以监听判断场景是否加载成功。

//为场景视图设置场景
sceneView.setSceneAsync(mScene, new SceneView.SceneFinishCallback() {
    @Override
    public void onDidFinish(boolean b) {
        if (b) {
            Toast.makeText(ShowVectorScene_Activity.this, "场景加载成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(ShowVectorScene_Activity.this, "场景加载失败", Toast.LENGTH_SHORT).show();
        }
    }
});

重要说明:场景加载整个流程中使用到的多个方法,都需要在MapGIS授权成功之后调用,否则不会起到任何作用。

0202离线三维矢量.jpg

离线三维地形 Sample详情

离线三维地形数据的加载方法和离线矢量数据类似,区别只在于三维图层的构建不一样。

//构建三维地形图层对象
TerrainLayer3D terrainLayer3D = new TerrainLayer3D();
//设置名称
terrainLayer3D.setName("三维地形");
//为图层设置驱动类型(GDAL数据驱动.用于离线栅格数据的读取)
terrainLayer3D.setDriverType(DriverType.Driver_Type_GDAL);
//设置URL:加载tif格式的地形数据
terrainLayer3D.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/tif/mt_everest_90m.tif");
//tif格式的地形数据无需设置空间参考系

离线三维地形.jpg

离线三维影像 Sample详情

准备好tif格式影像数据后使用如下方法加载。

//实例化三维服务图层对象
ServerLayer3D mTifLayer = new ServerLayer3D();
mTifLayer.setName("影像数据");
//为图层设置驱动类型(GDAL数据驱动.用于离线栅格数据的读取)
mTifLayer.setDriverType(DriverType.Driver_Type_GDAL);
//设置URL
mTifLayer.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/Tif/world.tif");
//设置图层数据的空间参考系(全球,WGS84,经纬度)
mTifLayer.setSRSByString(SRSType.SRS_Type_Global);

离线三维影像.jpg

离线三维模型 Sample详情

以倾斜摄影模型数据加载为例,首先准备.osgb倾斜摄影原始数据,然后需要使用MapGIS桌面平台软件对原始模型处理生成.mcx模型缓存文件,完成后将原始数据和.mcx文件都拷贝至移动设备存储中,然后调用以下方法加载。

//实例化模型图层对象
ModelCacheLayer3D modelLayer = new ModelCacheLayer3D();
modelLayer.setName("离线三维模型");
//为图层设置驱动类型(MapGIS倾斜摄影数据驱动)
modelLayer.setDriverType(DriverType.Driver_Type_Model_MapGIS_OP);
//设置URL
modelLayer.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/dayanta/dayanta.mcx");
//设置空间参考系(全球,WGS84,经纬度)
modelLayer.setSRSByString(SRSType.SRS_Type_Global);

离线三维模型.jpg

M3D离在线三维模型

M3D离线三维模型

以M3D三维模型缓存数据加载为例,先通过MapGIS桌面平台软件对三维模型处理生成M3D标准的三维模型缓存数据,完成后将缓存数据(包括.m3d缓存数据文件与.mcj配置文件)拷贝至移动设备存储中,然后调用以下方法加载。


//实例化模型图层对象
ModelCacheLayer3D mM3DModelCacheLayer = new ModelCacheLayer3D();
//为图层设置驱动类型(MapGIS M3D模型缓存数据)
mM3DModelCacheLayer.setDriverType(DriverType.Driver_Type_Model_MapGIS_M3D);
//设置URL
mM3DModelCacheLayer.setURL(android.os.Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Scene/models/m3d/jingguan/jingguan.mcj");
//加载模型图层
mScene.addLayer(mM3DModelCacheLayer);

M3D在线三维服务

以M3D三维模型缓存数据发布的三维服务为例,先通过MapGIS桌面平台软件对三维模型处理生成M3D标准的三维模型缓存数据,然后组织为一个三维地图文档.mapx,再通过IGServer服务器中发布的三维地图服务,最后调用以下方法加载。

//实例化三维服务图层对象
ServerLayer3D mM3DServerLayer3D = new ServerLayer3D();
//实例化地图服务(IGServer三维服务)
MapServer mapServer = ServerLayer3D.createMapServer(ServerLayer3D.MAPSERVER_TYPE_IGSERVER_SCENE);
//设置URL,添加三维数据
mapServer.setURL("http://develop.smaryun.com:6163/igs/rest/g3d/jingguan");
//设置地图服务
mM3DServerLayer3D.setMapServer(mapServer);
//加载服务图层
mScene.addLayer(mM3DServerLayer3D);

IGServer二维矢量地图服务 Sample详情

三维场景中可以添加在IGServer服务器中发布的二维矢量地图服务。

//实例化地图服务(IGServer矢量数据服务)
MapServer mServer = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_VECTOR);
//设置URL,添加二维数据
mServer.setURL("http://develop.smaryun.com:6163/igs/rest/mrms/docs/WorldJWVector");

//实例化三维服务图层对象
ServerLayer3D mServerLayer3D = new ServerLayer3D();
mServerLayer3D.setMapServer(mServer);  //设置地图服务
mServerLayer3D.setName("IGServer服务");
//设置驱动类型(MapGIS三维服务驱动)
mServerLayer3D.setDriverType(DriverType.Driver_Type_MapGIS_Map);
//设置空间参考系
mServerLayer3D.setSRSByString(SRSType.SRS_Type_Global);  //经纬度

IGServer矢量地图服务.jpg

IGServer二维瓦片地图服务 Sample详情

三维场景中可以添加在IGServer服务器中发布的二维瓦片地图服务。

//实例化地图服务(IGServer瓦片服务)
MapServer mServer = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_TILE);
//设置URL
mServer.setURL("http://develop.smaryun.com:6163/igs/rest/mrms/tile/JWWORLDTILE");

//实例化三维服务图层对象
ServerLayer3D mServerLayer3D = new ServerLayer3D();
//为服务图层设置地图服务
mServerLayer3D.setMapServer(mServer);
mServerLayer3D.setName("IGServer瓦片数据");
//设置驱动类型(MapGIS地图服务驱动)
mServerLayer3D.setDriverType(DriverType.Driver_Type_MapGIS_Map);
//根据数据类型设置空间参考系类型
mServerLayer3D.setSRSByString(SRSType.SRS_Type_Global);  //经纬度

IGServer瓦片地图服务.jpg

IGServer三维场景服务 Sample详情

首先需在IGServer服务器中发布三维场景服务,然后获取其URL,再调用以下方法加载展示。

//实例化地图服务(IGServer三维服务)
MapServer mServer = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_SCENE);
//设置URL
mServer.setURL("http://develop.smaryun.com:6163/igs/rest/g3d/WuHanJWScene");

//实例化三维服务图层对象
ServerLayer3D mServerLayer3D = new ServerLayer3D();
//为服务图层设置地图服务
mServerLayer3D.setMapServer(mServer);
mServerLayer3D.setName("IGServer服务");
//设置驱动类型(MapGIS三维服务驱动)
mServerLayer3D.setDriverType(DriverType.Driver_Type_MapGIS_3D);
//根据数据类型设置空间参考系类型,必须要加
mServerLayer3D.setSRSByString(SRSType.SRS_Type_Global);//经纬度

IGServer三维服务.jpg

在线WMS服务 Sample详情

支持OGC标准中的WMS服务,可以加载发布在IGServer服务器中的WMS地图服务。

//创建三维服务图层对象
ServerLayer3D mWmsServerLayer = new ServerLayer3D();
//设置驱动类型(OGC WMS服务驱动)
mWmsServerLayer.setDriverType(DriverType.Driver_Type_WMS);
//创建地图服务
MapServer mapServerWMS = ServerLayer3D.createMapServer(MapServer.MAPSERVER_TYPE_OGC_WMS);
//设置三维服务图层对象的地图服务
mWmsServerLayer.setMapServer(mapServerWMS);
//设置三维服务图层的地图服务URL
mWmsServerLayer.setURL("http://develop.smaryun.com:6163/igs/rest/ogc/layer/WorldJWVectLayer/WMSServer");
//根据数据类型设置空间参考系类型
mWmsServerLayer.setSRSByString(SRSType.SRS_Type_Global);//经纬度
//添加图层
mScene.addLayer(mWmsServerLayer);

WMS服务.jpg

在线WFS服务

支持OGC标准中的WFS服务,可以加载发布在IGServer服务器中的WFS地图服务。

mScene = new Scene();
//创建三维服务图层对象
WfsServerLayer3D = new ServerLayer3D();
WfsServerLayer3D.setName("wfs");
//设置驱动类型(OGC WFS服务驱动)
WfsServerLayer3D.setDriverType(DriverType.Driver_Type_WFS);
//创建地图服务
WfsServerLayer3D.setMapServer(ServerLayer3D.createMapServer(ServerLayer3D.MAPSERVER_TYPE_OGC_WFS));
//设置三维服务图层的地图服务URL
WfsServerLayer3D.setURL("http://gisserver.tianditu.gov.cn/TDTService/wfs");
//通过子线程加载添加图层
new Thread(new Runnable()
{
	@Override
	public void run()
	{
		// TODO Auto-generated method stub
		if(WfsServerLayer3D.isValid())
		{
			int count = WfsServerLayer3D.getLayerCount();
			for (int i = 0; i < count; i++) {
				Log.e("WfsServerLayer3D", WfsServerLayer3D.getLayer(i).getName());
				if (WfsServerLayer3D.getLayer(i).getName().equals("TDTService:BOUL")) 
				{
					WfsServerLayer3D.getLayer(i).setState(LayerState.Visible);
				}
			}
			//添加图层			
			mScene.addLayer(WfsServerLayer3D);
			mSceneView.setSunLightingMode(SunLightingMode.NONE);
			mSceneView.setScene(mScene);
		}
	}
}).start();

在线TMS服务 Sample详情

获取TMS服务地址之后采用如下方法加载。

//实例化三维服务图层对象
ServerLayer3D mTMSLayer3D = new ServerLayer3D();
mTMSLayer3D.setName("TMS三维数据");
//设置驱动类型(TMS服务驱动)
mTMSLayer3D.setDriverType(DriverType.Driver_Type_TMS);
//空间参考系类型
mTMSLayer3D.setSRSByString(SRSType.SRS_Type_Global);
//设置URL
mTMSLayer3D.setURL("http://readymap.org/readymap/tiles/1.0.0/7/");

TMS服务.jpg

在线Google地图服务 Sample详情

获取Google地图服务地址后使用以下方法加载。

//实例化三维服务图层对象
ServerLayer3D mGoogleLayer3D = new ServerLayer3D();
mGoogleLayer3D.setName("Google三维数据");
//设置驱动类型(标准Web墨卡托地图服务驱动.如Google、百度等)
mGoogleLayer3D.setDriverType(DriverType.Driver_Type_XYZ);
//设置空间参考系类型(全球,WGS84,WEB墨卡托)
mGoogleLayer3D.setSRSByString(SRSType.SRS_Type_Global_MERCATOR);
//设置URL
mGoogleLayer3D.setURL("http://mt[0123].google.cn/vt/lyrs=s@106&gl=cn&x={x}&y={y}&z={z}&s=Gali");

Google地图服务.jpg